package com.aop;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AOP[动态代理]:指定程序运行期间动态的将某段代码切入到指定位置进行运行的编程方式。
 *
 * 1、导入AOP模块，Spring-aop，spring-aspects
 * 2、定义一个业务逻辑类（MathCalculator），在业务逻辑运行的时候将日志进行打印（方法之前，之后，返回结果后，异常）
 * 3、定义一个日志切面类（LogAspect），切面类里的方法需要动态感知MathCalculator.div运行到
 *      前置通知：logStart，目标方法运行前执行
 *      后置通知：logEnd，目标方法执行后运行
 *      返回通知：logReturn，目标方法正常返回后运行
 *      异常通知：logError，目标方法出现异常后运行
 *      环绕通知：动态代理，手动推进目标方法运行（joinPoint.procced()）
 * 4、给切面类的目标方法标注何时何地运行（通知注解）
 *
 */
@EnableAspectJAutoProxy
@Configuration
public class MainConfigAop {

    @Bean
    public MathCalculator calculator(){
        return new MathCalculator();
    }

    @Bean
    public LogAspect logAspect(){
        return new LogAspect();
    }

}
